#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>

//int main()
//{
//    close(1);//这里的fd分配规则是：最小的，没有被占用的文件描述符。
//    int fd = open("log.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);
//    if (fd < 0)
//    {
//        perror("open");
//        return 1;
//    }
//    
//    //都应该是往显示器打印的！(标准输出)
//    //但是下面的都写入到了log.txt，这叫输出重定向
//    printf("fd: %d\n", fd);// stdout -> FILE(fileno=1)->log.txt
//    printf("fd: %d\n", fd);
//    printf("fd: %d\n", fd);
//    printf("fd: %d\n", fd);
//    fprintf(stdout, "hello fprintf!\n");
//    const char* s = "hello wwirte\n";
//    fwrite(s, strlen(s), 1, stdout);
//
//    //////////////////////////////////////////////////////////////////////////
//    fflush(stdout);
//    close(fd);
//    return 0;
//}


//int main()
//{
//    //close(1);
//    //int fd = open("log.txt", O_WRONLY | O_TRUNC | O_CREAT);
//    int fd = open("log.txt", O_WRONLY | O_APPEND | O_CREAT);
//    if (fd < 0)
//    {
//        perror("open");
//        return 1;
//    }
//    fprintf(stdout, "you can see me, success\n");
//
//
//   // printf("fd: %d\n",fd);
//
//   // char buffer[64];
//   // fgets(buffer, sizeof buffer, stdin);
//
//   // printf("%s\n", buffer);
//
//
//    return 0;
//}

//dup重定向
//int main(int argc, char* argv[])
//{
//    if (argc != 2)
//    {
//        return 2;
//    }
//    int fd = open("log.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);
//    //int fd = open("log.txt", O_WRONLY | O_APPEND | O_CREAT);
//    if(fd < 0)
//    {
//        perror("open");
//        return 1;
//    }
//    dup2(fd, 1);//重定向
//    fprintf(stdout, "%s\n", argv[1]);// stdout -> 1 -> 显示器
//    close(fd);
//
//    return 0;
//}

//缓冲区在哪呢？
int main()
{
    //C语言提供的
    printf("hello printf\n");
    fprintf(stdout, "hello fprintf\n");
    const char* s = "hello puts\n";
    fputs(s, stdout);
    
    //OS提供的接口
    const char* ss = "hello write\n";
    write(1, ss, strlen(ss));

    fork();//创建子进程

    return 0;
}
